package com.xyzwps.collections;

import java.util.Arrays;
import java.util.Random;

public final class Utils {
    /**
     * 创建一个具有指定容量的数组。
     */
    @SuppressWarnings("unchecked")
    public static <E> E[] newArray(int capacity) {
        return (E[]) new Object[capacity];
    }

    /**
     * 创建一个具有指定容量的数组，并把所有位置都填充上默认值。
     */
    public static <E> E[] newArray(int capacity, E defaultValue) {
        E[] array = newArray(capacity);
        if (defaultValue != null) Arrays.fill(array, defaultValue);
        return array;
    }


    /**
     * 扩大数组容量为原数组的 2 倍。
     */
    public static <E> E[] enlarge(E[] data) {
        return enlarge(data, data.length);
    }

    /**
     * 为数组增加指定容量。
     *
     * @param data    原数组
     * @param augment 容量增量
     * @param <E>     数组元素类型
     * @return 增加容量后的新数组
     */
    public static <E> E[] enlarge(E[] data, int augment) {
        final int newCapacity = data.length + augment;
        final E[] newData = newArray(newCapacity);
        System.arraycopy(data, 0, newData, 0, data.length);
        return newData;
    }


    /**
     * 把数组容量减半。使用前请确保 size < data.length / 2
     */
    public static <E> E[] shrink(E[] data, int size) {
        final int currentCapacity = data.length;
        final E[] newData = Utils.newArray(currentCapacity >> 1);
        System.arraycopy(data, 0, newData, 0, size);
        return newData;
    }

    public static final int ARRAY_BASED_COLLECTION_DEFAULT_CAPACITY = 32;

    public static int fit(int value, int sub, int sup) {
        if (value < sub) return sub;
        if (value > sup) return sup;
        return value;
    }

    private static final Random R = new Random(System.currentTimeMillis());

    public static int randomInt(int bound) {
        return R.nextInt(bound);
    }

}

